#pragma once

#include "Grid.hpp"

template <typename datatype>
struct KDNode
{
    /* data */
    datatype x, y, z;

    datatype _youngMod;                   // 杨氏模量
    datatype _poissonRatio;               // 泊松比
    datatype _rockDensity;                // 岩石密度
    datatype _porosity;                   // 孔隙率

        // 默认构造函数
    KDNode()
        : x(), y(), z(), _youngMod(0.0), _poissonRatio(0.0), _rockDensity(0.0), _porosity(0.0) {}

    // 带参数的构造函数
    KDNode(datatype xValue, datatype yValue, datatype zValue, datatype youngMod = 0.0, datatype poissonRatio = 0.0, datatype rockDensity = 0.0, datatype porosity = 0.0)
        : x(xValue), y(yValue), z(zValue), _youngMod(youngMod), _poissonRatio(poissonRatio), _rockDensity(rockDensity), _porosity(porosity) {}
};

template <typename datatype> 
int GridRemesh(const CornerGrid<false, datatype, GridCell<GridPoint<datatype>, datatype, 8>>& basegrid,
                FinElemGrid<GridCell<int, datatype, 4>, datatype, 4>& dstgrid, 
                double lc, double xExtensionFactor, double yExtensionFactor, double zExtensionUpper, double zExtensionLower);

template <typename datatype>
int ComputePrefix(
    const CornerGrid<true, datatype, GridCell<GridPoint<datatype>, datatype, 8>>& finegrid, 
    int NX, 
    int NY, 
    int NZ, 
    std::vector<std::pair<datatype, datatype>>& prefixZ, 
    std::vector<std::vector<std::pair<datatype, datatype>>>& prefixY
);

template <typename datatype>
int PropMapping(const CornerGrid<true, datatype, GridCell<GridPoint<datatype>, datatype, 8>>& srcgrid,
                const std::vector<std::pair<datatype, datatype>>& prefixZ, 
                const std::vector<std::vector<std::pair<datatype, datatype>>>& prefixY,
                FinElemGrid<GridCell<int, datatype, 4>, datatype, 4>& dstgrid);